// 天气API服务封装
class WeatherService {
  constructor() {
    // 使用免费的OpenWeatherMap API
    // 注意：在实际项目中，API密钥应该存储在环境变量中
    this.apiKey = 'demo_key'; // 这里使用演示密钥，实际使用时需要替换
    this.baseUrl = 'https://api.openweathermap.org/data/2.5';
    
    // 模拟数据，用于演示（当API密钥无效时使用）
    this.mockData = {
      '北京': {
        name: '北京',
        main: { temp: 22, feels_like: 25, humidity: 60 },
        weather: [{ main: 'Clear', description: '晴朗', icon: '01d' }],
        wind: { speed: 3.5 }
      },
      '上海': {
        name: '上海',
        main: { temp: 26, feels_like: 28, humidity: 75 },
        weather: [{ main: 'Clouds', description: '多云', icon: '02d' }],
        wind: { speed: 2.8 }
      },
      '广州': {
        name: '广州',
        main: { temp: 30, feels_like: 33, humidity: 80 },
        weather: [{ main: 'Rain', description: '小雨', icon: '10d' }],
        wind: { speed: 4.2 }
      },
      '深圳': {
        name: '深圳',
        main: { temp: 29, feels_like: 32, humidity: 78 },
        weather: [{ main: 'Thunderstorm', description: '雷阵雨', icon: '11d' }],
        wind: { speed: 5.1 }
      }
    };
  }

  /**
   * 获取城市天气信息
   * @param {string} cityName - 城市名称
   * @returns {Promise<Object>} 天气数据
   */
  async getWeatherByCity(cityName) {
    try {
      // 首先尝试使用真实API
      if (this.apiKey !== 'demo_key') {
        const url = `${this.baseUrl}/weather?q=${encodeURIComponent(cityName)}&appid=${this.apiKey}&units=metric&lang=zh_cn`;
        
        const response = await fetch(url);
        
        if (!response.ok) {
          throw new Error(`HTTP error! status: ${response.status}`);
        }
        
        const data = await response.json();
        return this.formatWeatherData(data);
      } else {
        // 使用模拟数据进行演示
        return this.getMockWeatherData(cityName);
      }
    } catch (error) {
      console.error('获取天气数据失败:', error);
      
      // 如果API请求失败，尝试返回模拟数据
      const mockData = this.getMockWeatherData(cityName);
      if (mockData) {
        return mockData;
      }
      
      throw new Error(`无法获取 ${cityName} 的天气信息，请检查城市名称是否正确`);
    }
  }

  /**
   * 获取模拟天气数据
   * @param {string} cityName - 城市名称
   * @returns {Object|null} 模拟天气数据
   */
  getMockWeatherData(cityName) {
    // 模拟网络延迟
    return new Promise((resolve) => {
      setTimeout(() => {
        const data = this.mockData[cityName];
        if (data) {
          resolve(this.formatWeatherData(data));
        } else {
          resolve(null);
        }
      }, 500 + Math.random() * 1000); // 0.5-1.5秒的随机延迟
    });
  }

  /**
   * 格式化天气数据
   * @param {Object} rawData - 原始API数据
   * @returns {Object} 格式化后的天气数据
   */
  formatWeatherData(rawData) {
    return {
      cityName: rawData.name,
      temperature: Math.round(rawData.main.temp),
      feelsLike: Math.round(rawData.main.feels_like),
      humidity: rawData.main.humidity,
      description: rawData.weather[0].description,
      weatherMain: rawData.weather[0].main,
      icon: rawData.weather[0].icon,
      windSpeed: rawData.wind?.speed || 0,
      timestamp: new Date().toISOString()
    };
  }

  /**
   * 获取天气图标URL
   * @param {string} iconCode - 图标代码
   * @returns {string} 图标URL
   */
  getWeatherIconUrl(iconCode) {
    return `https://openweathermap.org/img/wn/${iconCode}@2x.png`;
  }

  /**
   * 根据天气状况获取本地图标
   * @param {string} weatherMain - 主要天气状况
   * @returns {string} 图标emoji或符号
   */
  getLocalWeatherIcon(weatherMain) {
    const iconMap = {
      'Clear': '☀️',
      'Clouds': '☁️',
      'Rain': '🌧️',
      'Drizzle': '🌦️',
      'Thunderstorm': '⛈️',
      'Snow': '❄️',
      'Mist': '🌫️',
      'Fog': '🌫️',
      'Haze': '🌫️'
    };
    
    return iconMap[weatherMain] || '🌤️';
  }

  /**
   * 验证城市名称
   * @param {string} cityName - 城市名称
   * @returns {boolean} 是否有效
   */
  validateCityName(cityName) {
    if (!cityName || typeof cityName !== 'string') {
      return false;
    }
    
    const trimmed = cityName.trim();
    return trimmed.length > 0 && trimmed.length <= 50;
  }
}

// 创建单例实例
const weatherService = new WeatherService();

export default weatherService;